分層式架構,在本專案分為:
1.DataAccess
存放資料庫連線相關程式碼與檔案
包含連線字串與Migration與建立的Repository & UnitOfWork
2.Models
存放資料欄位的定義。
資料表相關在此存放。
3.Utility
存放共用函式庫,訂單與會員系統會使用到
將DataAccess、Models、Utility的Class.cs都刪除。
1.DataAccess:將原本Data與Migrations資料夾移入DataAccess
2.Models:將Models資料夾內的Model移入專案Models;
專案Models新增ViewModels資料夾
3.Utility
右鍵=>加入-類別=>取名SD.cs
修正ApplicationDbContext.cs
開啟NuGet,在DataAccess安裝:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.AspNetCore.Identity.EntityFrameworkCore
原專案內的套件可以移除或不做處理。
DataAccess專案參考
DataAccess=>右鍵=>加入=>專案參考勾選Models與Utility
Repository與UnitOfWork
1.Repository:
代表一個Table
2.UnitOfWork:
代表一個資料庫DB
同時更新或新增多個資料表時,使用UnitOfWork,用於追蹤每個動作。
CRUD時,DbContext將變更紀錄一次性寫入資料庫。
Repository
1.建立資料庫介面:Repository
2.實現資料庫介面:包含方法實現(IRepository的定義)
3.在IUnitOfWork內加入屬性
IUnitOfWork:此為IcategoryRepository創建對象
4.在IUnitOfWork內設置屬性
分配DbContext設置IUnitOfWork中的屬性
新增Repository與UnitOfWork
1.DataAccess=>右鍵=>加入新增資料夾=> Repository。
新增Repository.cs介面
新增UnitOfWork
2.Repository底下新增IRepository資料夾
IRepository新增IRepository.cs介面
新增IUnitOfWork
public interface IRepository<T> where T : class
{
IEnumerable<T> GetAll();
T Get(Expression<Func<T, bool>> filiter);
void Add(T entity);
void Remove(T entity);
void RemoveRange(IEnumerable<T> entit);
}
public class Repository<T> : IRepository<T> where T : class
{
private readonly ApplicationDbContext _db;
internal DbSet<T> dbSet;
public Repository(ApplicationDbContext db)
{
_db = db;
this.dbSet = _db.Set<T>();
}
}
將每個方法throw new NotImplementedException();實作
public void Add(T entity)
{
dbSet.Add(entity);
}
public T Get(Expression<Func<T, bool>> filiter)
{
IQueryable<T> query = dbSet;
query = query.Where(filiter);
return query.FirstOrDefault();
}
public IEnumerable<T> GetAll()
{
IQueryable<T> query = dbSet;
return query.ToList();
}
public void Remove(T entity)
{
dbSet.Remove(entity);
}
public void RemoveRange(IEnumerable<T> entity)
{
dbSet.RemoveRange(entity);
}
_db是可讀取變數。
ApplicationDbContext代表程式與資料庫連結。
dbSet是DbSet變數,EF提供的通用型別。
用來代表資料庫中的資料集合。
其中T是通用型參數。
DbSet物件可動態存取不同資料表,
不用為每個資料表都寫專門的程式。
*建立UnitOfWork
將SaveChanges() ,新增至UnitOfWork
IUnitOfWork再使用Save調用,會比較簡潔。
public class UnitOfWork : IUnitOfWork
{
private ApplicationDbContext _db;
public UnitOfWork(ApplicationDbContext db)
{
_db = db;
}
public void Save()
{
_db.SaveChanges();
}
}
public interface IUnitOfWork
{
void Save();
}
View內的Category與Home移至Admin與Customer底下的View資料夾。
_ViewImports.cshtml、_ViewStart.cshtml則要同時複製,貼上到Admin與Customer底下的View資料夾。
Program.cs註冊依賴注入與修改預設路由:
app.MapControllerRoute(
name: "default",
pattern:
"{area=Customer}/{controller=Home}/{action=Index}/{id?}");
新增:
builder.Services.AddRazorPages();
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
錯誤處右鍵=>重構=>using UnitOfWork
以上就是分層架構的基礎框架。
明天進入如何建立資料。